package com.gitee.qdbp.general.trade.api.personal.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.gitee.qdbp.able.jdbc.paging.PartList;
import com.gitee.qdbp.base.enums.Gender;

/**
 * 用户地址实体类
 *
 * @author zhh
 * @version 180716
 */
public class PersonalAddressBase implements Serializable {

    /** 版本序列号 **/
    private static final long serialVersionUID = 1L;

    /** 标签: 如家,公司等 **/
    private String tagName;

    /** 联系人姓名 **/
    private String contactName;

    /** 性别(0.未知|1.男|2.女) **/
    private Gender contactGender;

    /** 联系人电话 **/
    private String contactPhone;

    /** 地区编号(关联行政区划表) **/
    private String areaCode;

    /** 地区名称(由于地区编号经常会变, 需要保存地区名称) **/
    private String areaText;

    /** 乡镇或街道名称 **/
    private String township;

    /** 详细地址 **/
    private String address;

    /** 获取标签: 如家,公司等 **/
    public String getTagName() {
        return tagName;
    }

    /** 设置标签: 如家,公司等 **/
    public void setTagName(String tagName) {
        this.tagName = tagName;
    }

    /** 获取联系人姓名 **/
    public String getContactName() {
        return contactName;
    }

    /** 设置联系人姓名 **/
    public void setContactName(String contactName) {
        this.contactName = contactName;
    }

    /** 获取性别(0.未知|1.男|2.女) **/
    public Gender getContactGender() {
        return contactGender;
    }

    /** 设置性别(0.未知|1.男|2.女) **/
    public void setContactGender(Gender contactGender) {
        this.contactGender = contactGender;
    }

    /** 获取联系人电话 **/
    public String getContactPhone() {
        return contactPhone;
    }

    /** 设置联系人电话 **/
    public void setContactPhone(String contactPhone) {
        this.contactPhone = contactPhone;
    }

    /** 获取地区编号(关联行政区划表) **/
    public String getAreaCode() {
        return areaCode;
    }

    /** 设置地区编号(关联行政区划表) **/
    public void setAreaCode(String areaCode) {
        this.areaCode = areaCode;
    }

    /** 获取地区名称(由于地区编号经常会变, 需要保存地区名称) **/
    public String getAreaText() {
        return areaText;
    }

    /** 设置地区名称(由于地区编号经常会变, 需要保存地区名称) **/
    public void setAreaText(String areaText) {
        this.areaText = areaText;
    }

    /** 获取乡镇或街道名称 **/
    public String getTownship() {
        return township;
    }

    /** 设置乡镇或街道名称 **/
    public void setTownship(String township) {
        this.township = township;
    }

    /** 获取详细地址 **/
    public String getAddress() {
        return address;
    }

    /** 设置详细地址 **/
    public void setAddress(String address) {
        this.address = address;
    }

    /**
     * 将当前对象转换为子类对象
     *
     * @param clazz 目标类型
     * @return 目标对象
     */
    public <T extends PersonalAddressBase> T to(Class<T> clazz) {
        T instance;
        try {
            instance = clazz.newInstance();
        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to create " + clazz.getSimpleName() + " instance.", e);
        }

        instance.setTagName(this.getTagName()); // 标签: 如家,公司等
        instance.setContactName(this.getContactName()); // 联系人姓名
        instance.setContactGender(this.getContactGender()); // 性别(0.未知|1.男|2.女)
        instance.setContactPhone(this.getContactPhone()); // 联系人电话
        instance.setAreaCode(this.getAreaCode()); // 地区编号(关联行政区划表)
        instance.setAreaText(this.getAreaText()); // 地区名称(由于地区编号经常会变, 需要保存地区名称)
        instance.setTownship(this.getTownship()); // 乡镇或街道名称
        instance.setAddress(this.getAddress()); // 详细地址
        return instance;
    }

    /**
     * 将PersonalAddressBean转换为子类对象
     *
     * @param beans 待转换的对象列表
     * @param clazz 目标类型
     * @param <T> PersonalAddressBean或子类
     * @param <C> T的子类
     * @return 目标对象列表
     */
    public static <T extends PersonalAddressBase, C extends T> List<C> to(List<T> beans, Class<C> clazz) {
        if (beans == null) {
            return null;
        }
        List<C> list;
        if (beans instanceof PartList) {
            PartList<C> partlist = new PartList<>();
            partlist.setTotal(((PartList<?>) beans).getTotal());
            list = partlist;
        } else {
            list = new ArrayList<>();
        }
        for (PersonalAddressBase bean : beans) {
            list.add(bean.to(clazz));
        }
        return list;
    }

}